home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / actionrp / angband_.5 / angband_ / src / scrolls.c < prev    next >
C/C++ Source or Header  |  1994-04-21  |  15KB  |  537 lines

  1. /*
  2.  * scrolls.c: scroll code 
  3.  *
  4.  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke 
  5.  *
  6.  * This software may be copied and distributed for educational, research, and
  7.  * not for profit purposes provided that this copyright and statement are
  8.  * included in all such copies. 
  9.  */
  10.  
  11. #include "constant.h"
  12. #include "monster.h"
  13. #include "config.h"
  14. #include "types.h"
  15. #include "externs.h"
  16.  
  17. #ifdef USG
  18. #include <string.h>
  19. #else
  20. #include <strings.h>
  21. #endif
  22.  
  23. /* Scrolls for the reading                -RAK-     */
  24. void 
  25. read_scroll()
  26. {
  27.     int32u              i;
  28.     int                 j, k, item_val, y, x;
  29.     int                 tmp[6], flag, used_up;
  30.     bigvtype            out_val, tmp_str;
  31.     register int        ident, l;
  32.     register inven_type *i_ptr;
  33.     register struct misc *m_ptr;
  34.  
  35.     free_turn_flag = TRUE;
  36.     if (py.flags.blind > 0)
  37.     msg_print("You can't see to read the scroll.");
  38.     else if (no_light())
  39.     msg_print("You have no light to read by.");
  40.     else if (py.flags.confused > 0)
  41.     msg_print("You are too confused to read a scroll.");
  42.     else if (inven_ctr == 0)
  43.     msg_print("You are not carrying anything!");
  44.     else if (!find_range(TV_SCROLL1, TV_SCROLL2, &j, &k))
  45.     msg_print("You are not carrying any scrolls!");
  46.     else if (get_item(&item_val, "Read which scroll?", j, k, 0)) {
  47.     i_ptr = &inventory[item_val];
  48.     free_turn_flag = FALSE;
  49.     used_up = TRUE;
  50.     i = i_ptr->flags;
  51.     ident = FALSE;
  52.  
  53.     while (i != 0) {
  54.         j = bit_pos(&i) + 1;
  55.         if (i_ptr->tval == TV_SCROLL2)
  56.         j += 32;
  57.  
  58.     /* Scrolls.             */
  59.         switch (j) {
  60.           case 1:
  61.         i_ptr = &inventory[INVEN_WIELD];
  62.         if (i_ptr->tval != TV_NOTHING) {
  63.             objdes(tmp_str, i_ptr, FALSE);
  64.             if ((i_ptr->flags2 & TR_ARTIFACT) && randint(2) == 1) {    /* DGK */
  65.             sprintf(out_val, "Your %s resists enchantment!",
  66.                 tmp_str);
  67.             msg_print(out_val);
  68.             } else {
  69.             (void)sprintf(out_val, "Your %s glows faintly!",
  70.                       tmp_str);
  71.             msg_print(out_val);
  72.             if (enchant(&i_ptr->tohit, 10))
  73.             /* used to clear TR_CURSED; should remain set -DGK- */
  74.                 calc_bonuses();
  75.             else
  76.                 msg_print("The enchantment fails.");
  77.             } /* DGK */
  78.             ident = TRUE;
  79.         }
  80.         break;
  81.           case 2:
  82.         i_ptr = &inventory[INVEN_WIELD];
  83.         if (i_ptr->tval != TV_NOTHING) {
  84.             objdes(tmp_str, i_ptr, FALSE);
  85.             if ((i_ptr->flags2 & TR_ARTIFACT) && randint(2) == 1) {    /* DGK */
  86.             sprintf(out_val, "Your %s resists enchantment!",
  87.                 tmp_str);
  88.             msg_print(out_val);
  89.             } else {
  90.             int                 maxench;
  91.  
  92.             (void)sprintf(out_val, "Your %s glows faintly!",
  93.                       tmp_str);
  94.             msg_print(out_val);
  95.             if ((i_ptr->tval >= TV_HAFTED) &&
  96.                 (i_ptr->tval <= TV_DIGGING))
  97.                 maxench = i_ptr->damage[0] * i_ptr->damage[1];
  98.             else       /* Bows' and arrows' enchantments should
  99.                     * not be limited by their low base
  100.                     * damages */
  101.                 maxench = 10;
  102.             if (enchant(&i_ptr->todam, maxench))
  103.                 calc_bonuses();
  104.             /* used to clear TR_CURSED; should remain set -DGK- */
  105.             else
  106.                 msg_print("The enchantment fails.");
  107.             } /* DGK */
  108.             ident = TRUE;
  109.         }
  110.         break;
  111.           case 3:
  112.         k = 0;
  113.         l = 0;
  114.         if (inventory[INVEN_BODY].tval != TV_NOTHING)
  115.             tmp[k++] = INVEN_BODY;
  116.         if (inventory[INVEN_ARM].tval != TV_NOTHING)
  117.             tmp[k++] = INVEN_ARM;
  118.         if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  119.             tmp[k++] = INVEN_OUTER;
  120.         if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  121.             tmp[k++] = INVEN_HANDS;
  122.         if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  123.             tmp[k++] = INVEN_HEAD;
  124.         /* also enchant boots */
  125.         if (inventory[INVEN_FEET].tval != TV_NOTHING)
  126.             tmp[k++] = INVEN_FEET;
  127.  
  128.         if (k > 0)
  129.             l = tmp[randint(k) - 1];
  130.         if (TR_CURSED & inventory[INVEN_BODY].flags)
  131.             l = INVEN_BODY;
  132.         else if (TR_CURSED & inventory[INVEN_ARM].flags)
  133.             l = INVEN_ARM;
  134.         else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  135.             l = INVEN_OUTER;
  136.         else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  137.             l = INVEN_HEAD;
  138.         else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  139.             l = INVEN_HANDS;
  140.         else if (TR_CURSED & inventory[INVEN_FEET].flags)
  141.             l = INVEN_FEET;
  142.  
  143.         if (l > 0) {
  144.             i_ptr = &inventory[l];
  145.             objdes(tmp_str, i_ptr, FALSE);
  146.             if ((i_ptr->flags2 & TR_ARTIFACT) && randint(2) == 1) {    /* DGK */
  147.             sprintf(out_val, "Your %s resists enchantment!",
  148.                 tmp_str);
  149.             msg_print(out_val);
  150.             } else {
  151.             (void)sprintf(out_val, "Your %s glows faintly!",
  152.                       tmp_str);
  153.             msg_print(out_val);
  154.             if (enchant(&i_ptr->toac, 10))
  155.             /* used to clear TR_CURSED; should remain set -DGK- */
  156.                 calc_bonuses();
  157.             else
  158.                 msg_print("The enchantment fails.");
  159.             } /* DGK */
  160.             ident = TRUE;
  161.         }
  162.         break;
  163.           case 4:
  164.         msg_print("This is an identify scroll.");
  165.         ident = TRUE;
  166.         used_up = ident_spell();
  167.  
  168.         /*
  169.          * The identify may merge objects, causing the identify scroll to
  170.          * move to a different place.    Check for that here.  It can
  171.          * move arbitrarily far if an identify scroll was used on another
  172.          * identify scroll, but it always moves down. 
  173.          */
  174.         while (i_ptr->tval != TV_SCROLL1 || i_ptr->flags != 0x00000008) {
  175.             item_val--;
  176.             i_ptr = &inventory[item_val];
  177.         }
  178.         break;
  179.           case 5:
  180.         if (remove_curse()) {
  181.             msg_print("You feel as if someone is watching over you.");
  182.             ident = TRUE;
  183.         }
  184.         break;
  185.           case 6:
  186.         ident = light_area(char_row, char_col, damroll(2, 12), 2);
  187.         break;
  188.           case 7:
  189.         for (k = 0; k < randint(3); k++) {
  190.             y = char_row;
  191.             x = char_col;
  192.             ident |= summon_monster(&y, &x, FALSE);
  193.         }
  194.         break;
  195.           case 8:
  196.         teleport(10);
  197.         ident = TRUE;
  198.         break;
  199.           case 9:
  200.         teleport(100);
  201.         ident = TRUE;
  202.         break;
  203.           case 10:
  204.         (void)tele_level();
  205.         ident = TRUE;
  206.         break;
  207.           case 11:
  208.         if (py.flags.confuse_monster == 0) {
  209.             msg_print("Your hands begin to glow.");
  210.             py.flags.confuse_monster = TRUE;
  211.             ident = TRUE;
  212.         }
  213.         break;
  214.           case 12:
  215.         ident = TRUE;
  216.         map_area();
  217.         break;
  218.           case 13:
  219.         ident = sleep_monsters1(char_row, char_col);
  220.         break;
  221.           case 14:
  222.         ident = TRUE;
  223.         warding_glyph();
  224.         break;
  225.           case 15:
  226.         ident = detect_treasure();
  227.         break;
  228.           case 16:
  229.         ident = detect_object();
  230.         break;
  231.           case 17:
  232.         ident = detect_trap();
  233.         break;
  234.           case 18:
  235.         ident = detect_sdoor();
  236.         break;
  237.           case 19:
  238.         msg_print("This is a mass genocide scroll.");
  239.         ident = TRUE;
  240.         mass_genocide(TRUE);
  241.         break;
  242.           case 20:
  243.         ident = detect_invisible();
  244.         break;
  245.           case 21:
  246.         ident = aggravate_monster(20);
  247.         if (ident)
  248.             msg_print("There is a high pitched humming noise.");
  249.         break;
  250.           case 22:
  251.         ident = trap_creation();
  252.         break;
  253.           case 23:
  254.         ident = td_destroy();
  255.         break;
  256.           case 24:           /* Not Used , used to be door creation */
  257.         break;
  258.           case 25:
  259.         msg_print("This is a Recharge-Item scroll.");
  260.         ident = TRUE;
  261.         used_up = recharge(60);
  262.         break;
  263.           case 26:
  264.         msg_print("This is a genocide scroll.");
  265.         ident = TRUE;
  266.         genocide(TRUE);
  267.         break;
  268.           case 27:
  269.         ident = unlight_area(char_row, char_col);
  270.         py.flags.blind += 3 + randint(5);
  271.         break;
  272.           case 28:
  273.         ident = protect_evil();
  274.         break;
  275.           case 29:
  276.         ident = TRUE;
  277.         create_food();
  278.         break;
  279.           case 30:
  280.         ident = dispel_creature(UNDEAD, 60);
  281.         break;
  282.           case 31:
  283.         remove_all_curse();
  284.         ident = TRUE;
  285.         break;
  286.           case 33:
  287.         i_ptr = &inventory[INVEN_WIELD];
  288.         if (i_ptr->tval != TV_NOTHING) {
  289.             objdes(tmp_str, i_ptr, FALSE);
  290.             if ((i_ptr->flags2 & TR_ARTIFACT) && randint(2) == 1) {    /* DGK */
  291.             sprintf(out_val, "Your %s resists enchantment!",
  292.                 tmp_str);
  293.             msg_print(out_val);
  294.             } else {
  295.             (void)sprintf(out_val, "Your %s glows brightly!",
  296.                       tmp_str);
  297.             msg_print(out_val);
  298.             flag = FALSE;
  299.             for (k = 0; k < randint(2); k++)
  300.                 if (enchant(&i_ptr->tohit, 15))
  301.                 flag = TRUE;
  302.             for (k = 0; k < randint(2); k++) {
  303.                 int                 maxench;
  304.  
  305.                 if ((i_ptr->tval >= TV_HAFTED) &&
  306.                 (i_ptr->tval <= TV_DIGGING))
  307.                 maxench = i_ptr->damage[0] * i_ptr->damage[1] + 5;
  308.                 else   /* Bows' and arrows' enchantments should
  309.                     * not be limited by their low base
  310.                     * damages */
  311.                 maxench = 15;
  312.                 if (enchant(&i_ptr->todam, maxench))
  313.                 flag = TRUE;
  314.             }
  315.             if (flag)
  316.             /* used to clear TR_CURSED; should remain set -DGK- */
  317.                 calc_bonuses();
  318.             else
  319.                 msg_print("The enchantment fails.");
  320.             } /* DGK */
  321.             ident = TRUE;
  322.         }
  323.         break;
  324.           case 34:
  325.         i_ptr = &inventory[INVEN_WIELD];
  326.         if (i_ptr->tval != TV_NOTHING) {
  327.             objdes(tmp_str, i_ptr, FALSE);
  328.             if ((i_ptr->flags2 & TR_ARTIFACT) && (randint(7) < 4)) {
  329.         msg_print("A terrible black aura tries to surround your weapon,");
  330.         (void)sprintf(out_val, "but your %s resists the effects!", tmp_str);
  331.             msg_print(out_val);
  332.             } else {       /* not artifact or failed save... */
  333.         (void)sprintf(out_val, "A terrible black aura blasts your %s!", tmp_str);
  334.             msg_print(out_val);
  335.             py_bonuses(i_ptr, -1);    /* take off current bonuses -CFT */
  336.             i_ptr->name2 = SN_SHATTERED;
  337.             i_ptr->tohit = (-randint(5) - randint(5));
  338.             i_ptr->todam = (-randint(5) - randint(5));
  339.             i_ptr->flags = TR_CURSED;
  340.             i_ptr->flags2 = 0;
  341.             i_ptr->damage[0] = i_ptr->damage[1] = 1;
  342.             i_ptr->toac = 0;    /* in case defender... */
  343.             i_ptr->cost = (-1);
  344.             py_bonuses(i_ptr, 1);    /* now apply new "bonuses"
  345.                          * -CFT */
  346.             calc_bonuses();
  347.             }
  348.             ident = TRUE;  /* even if artifact makes save... */
  349.         }
  350.         break;
  351.           case 35:
  352.         k = 0;
  353.         l = 0;
  354.         if (inventory[INVEN_BODY].tval != TV_NOTHING)
  355.             tmp[k++] = INVEN_BODY;
  356.         if (inventory[INVEN_ARM].tval != TV_NOTHING)
  357.             tmp[k++] = INVEN_ARM;
  358.         if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  359.             tmp[k++] = INVEN_OUTER;
  360.         if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  361.             tmp[k++] = INVEN_HANDS;
  362.         if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  363.             tmp[k++] = INVEN_HEAD;
  364.         /* also enchant boots */
  365.         if (inventory[INVEN_FEET].tval != TV_NOTHING)
  366.             tmp[k++] = INVEN_FEET;
  367.  
  368.         if (k > 0)
  369.             l = tmp[randint(k) - 1];
  370.         if (TR_CURSED & inventory[INVEN_BODY].flags)
  371.             l = INVEN_BODY;
  372.         else if (TR_CURSED & inventory[INVEN_ARM].flags)
  373.             l = INVEN_ARM;
  374.         else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  375.             l = INVEN_OUTER;
  376.         else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  377.             l = INVEN_HEAD;
  378.         else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  379.             l = INVEN_HANDS;
  380.         else if (TR_CURSED & inventory[INVEN_FEET].flags)
  381.             l = INVEN_FEET;
  382.  
  383.         if (l > 0) {
  384.             i_ptr = &inventory[l];
  385.             objdes(tmp_str, i_ptr, FALSE);
  386.             if ((i_ptr->flags2 & TR_ARTIFACT) && randint(2) == 1) {    /* DGK */
  387.             sprintf(out_val, "Your %s resists enchantment!",
  388.                 tmp_str);
  389.             msg_print(out_val);
  390.             } else {
  391.             (void)sprintf(out_val, "Your %s glows brightly!",
  392.                       tmp_str);
  393.             msg_print(out_val);
  394.             flag = FALSE;
  395.             for (k = 0; k < randint(2) + 1; k++)
  396.                 if (enchant(&i_ptr->toac, 15))
  397.                 flag = TRUE;
  398.             if (flag)
  399.             /* used to clear TR_CURSED; should remain set -DGK- */
  400.                 calc_bonuses();
  401.             else
  402.                 msg_print("The enchantment fails.");
  403.             } /* DGK */
  404.             ident = TRUE;
  405.         }
  406.         break;
  407.           case 36:
  408.         if ((inventory[INVEN_BODY].tval != TV_NOTHING)
  409.             && (randint(4) == 1))
  410.             k = INVEN_BODY;
  411.         else if ((inventory[INVEN_ARM].tval != TV_NOTHING)
  412.              && (randint(3) == 1))
  413.             k = INVEN_ARM;
  414.         else if ((inventory[INVEN_OUTER].tval != TV_NOTHING)
  415.              && (randint(3) == 1))
  416.             k = INVEN_OUTER;
  417.         else if ((inventory[INVEN_HEAD].tval != TV_NOTHING)
  418.              && (randint(3) == 1))
  419.             k = INVEN_HEAD;
  420.         else if ((inventory[INVEN_HANDS].tval != TV_NOTHING)
  421.              && (randint(3) == 1))
  422.             k = INVEN_HANDS;
  423.         else if ((inventory[INVEN_FEET].tval != TV_NOTHING)
  424.              && (randint(3) == 1))
  425.             k = INVEN_FEET;
  426.         else if (inventory[INVEN_BODY].tval != TV_NOTHING)
  427.             k = INVEN_BODY;
  428.         else if (inventory[INVEN_ARM].tval != TV_NOTHING)
  429.             k = INVEN_ARM;
  430.         else if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  431.             k = INVEN_OUTER;
  432.         else if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  433.             k = INVEN_HEAD;
  434.         else if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  435.             k = INVEN_HANDS;
  436.         else if (inventory[INVEN_FEET].tval != TV_NOTHING)
  437.             k = INVEN_FEET;
  438.         else
  439.             k = 0;
  440.  
  441.         if (k > 0) {
  442.             i_ptr = &inventory[k];
  443.             objdes(tmp_str, i_ptr, FALSE);
  444.             if ((i_ptr->flags2 & TR_ARTIFACT) && (randint(7) < 4)) {
  445.             msg_print("A terrible black aura tries to surround your");
  446.         (void)sprintf(out_val, "%s, but it resists the effects!", tmp_str);
  447.             msg_print(out_val);
  448.             } else {       /* not artifact or failed save... */
  449.         (void)sprintf(out_val, "A terrible black aura blasts your %s!", tmp_str);
  450.             msg_print(out_val);
  451.             py_bonuses(i_ptr, -1);    /* take off current bonuses
  452.                          * -CFT */
  453.             i_ptr->name2 = SN_BLASTED;
  454.             i_ptr->flags = TR_CURSED;
  455.             i_ptr->flags2 = 0;
  456.             i_ptr->toac = (-randint(5) - randint(5));
  457.             i_ptr->tohit = i_ptr->todam = 0; /* in case gaunlets of
  458.                              * slaying... */
  459.             i_ptr->ac = (i_ptr->ac > 9) ? 1 : 0;
  460.             i_ptr->cost = (-1);
  461.             py_bonuses(i_ptr, 1);    /* now apply new "bonuses"
  462.                          * -CFT */
  463.             calc_bonuses();
  464.             }
  465.             ident = TRUE;  /* even if artifact makes save... */
  466.         }
  467.         break;
  468.           case 37:
  469.         ident = FALSE;
  470.         for (k = 0; k < randint(3); k++) {
  471.             y = char_row;
  472.             x = char_col;
  473.             ident |= summon_undead(&y, &x);
  474.         }
  475.         break;
  476.           case 38:
  477.         ident = TRUE;
  478.         bless(randint(12) + 6);
  479.         break;
  480.           case 39:
  481.         ident = TRUE;
  482.         bless(randint(24) + 12);
  483.         break;
  484.           case 40:
  485.         ident = TRUE;
  486.         bless(randint(48) + 24);
  487.         break;
  488.           case 41:
  489.         ident = TRUE;
  490.         if (py.flags.word_recall == 0) {
  491.             py.flags.word_recall = 15 + randint(20);
  492.             msg_print("The air about you becomes charged...");
  493.         } else {
  494.             py.flags.word_recall = 0;
  495.             msg_print("A tension leaves the air around you...");
  496.         }
  497.         break;
  498.           case 42:
  499.         destroy_area(char_row, char_col);
  500.         ident = TRUE;
  501.         break;
  502.           case 43:
  503.         place_special(char_row, char_col, SPECIAL);
  504.         ident = TRUE;
  505.         prt_map();
  506.         break;
  507.           case 44:
  508.         special_random_object(char_row, char_col, 1);
  509.         ident = TRUE;
  510.         prt_map();
  511.         break;
  512.           default:
  513.         msg_print("Internal error in scroll()");
  514.         break;
  515.         }
  516.     /* End of Scrolls.                   */
  517.     }
  518.     i_ptr = &inventory[item_val];
  519.     if (ident) {
  520.         if (!known1_p(i_ptr)) {
  521.         m_ptr = &py.misc;
  522.         /* round half-way case up */
  523.         m_ptr->exp += (i_ptr->level + (m_ptr->lev >> 1)) / m_ptr->lev;
  524.         prt_experience();
  525.  
  526.         identify(&item_val);
  527.         i_ptr = &inventory[item_val];
  528.         }
  529.     } else if (!known1_p(i_ptr))
  530.         sample(i_ptr);
  531.     if (used_up) {
  532.         desc_remain(item_val);
  533.         inven_destroy(item_val);
  534.     }
  535.     }
  536. }
  537.